/*
  https://dart.cn/tutorials/language/streams

  本章的重点
Stream 提供一个异步的数据序列。

数据序列包括用户生成的事件和从文件读取的数据。

你可以使用 Stream API 中的 listen() 方法和 await for 关键字来处理一个 Stream。

当出现错误时，Stream 提供一种处理错误的方式。

Stream 有两种类型：Single-Subscription 和 Broadcast。

 */
void main() async {
  var stream = countStream(10);
  var sum = await sumStream(stream);
  print(sum);
  //55
}

/*
  该代码只是简单地接收整型事件流中的每一个事件并将它们相加，然后返回（被 Future 包裹）相加后的整型值。
  当循环体结束时，函数会暂停直到下一个事件到达或 Stream 完成。

  内部使用 await for 循环的函数需要使用 async 关键字标记。

 */

Future<int> sumStream(Stream<int> stream) async {
  var sum = 0;
  await for (final value in stream) {
    sum += value;
  }
  return sum;
}

Stream<int> countStream(int to) async* {
  for (int i = 1; i <= to; i++) {
    yield i;
  }
}

/*
  Stream 的使用
  Stream 类中包含了许多像 Iterable 类中一样的辅助方法帮助你实现一些常用的操作。例如，你可以使用 Stream API 中的 lastWhere() 方法从 Stream 中找出最后一个正整数

 */
Future<int> lastPositive(Stream<int> stream) => stream.lastWhere((x) => x >= 0);